package cn.kgc.itrip.service;

import cn.kgc.itrip.common.Constants;
import cn.kgc.itrip.common.DtoUtil;
import cn.kgc.itrip.common.EmptyUtils;
import cn.kgc.itrip.common.Page;
import cn.kgc.itrip.dto.Dto;
import cn.kgc.itrip.vo.ItripHotelVO;
import cn.kgc.itrip.vo.hotel.SearchHotCityVO;
import cn.kgc.itrip.vo.hotel.SearchHotelVO;
import org.apache.solr.client.solrj.SolrQuery;
import org.springframework.data.domain.Sort;
import org.springframework.data.solr.core.SolrTemplate;
import org.springframework.data.solr.core.query.Criteria;
import org.springframework.data.solr.core.query.Query;
import org.springframework.data.solr.core.query.SimpleQuery;
import org.springframework.data.solr.core.query.result.ScoredPage;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

/**
 * @program: love_travel
 * @description: 酒店三级查询实现
 * @author: Mr.Wang
 * @create: 2020-03-25 18:32
 **/

@Service
public class SearchServiceImpl implements SearchService {

    @Resource
    private SolrTemplate solrTemplate;

    /**
     * solr的三级酒店查询
     * @param vo
     * @return
     */
    @Override
    public Dto findItripHotelPage(SearchHotelVO vo) {
        //判断目的地是否为空
        if (EmptyUtils.isEmpty(vo.getDestination())){
            return DtoUtil.returnFail(" 目的地不能为空","20002");
        }
        //凭借查询条件
        //如果没有条件查询，就以solr中的q:*:*，来查询
        Query query=new SimpleQuery("*:*");
        //q条件查询
        //目的地
        //必须与solr中的key一致
        Criteria criteria = new Criteria("destination");
        if (EmptyUtils.isNotEmpty(vo.getDestination())){
            criteria=criteria.contains(vo.getDestination());
        }
        //关键字
        if (EmptyUtils.isNotEmpty(vo.getKeywords())){
            criteria=criteria.and("Keyword").contains(vo.getKeywords());
        }
        //fq条件查询
        //商圈
        if (EmptyUtils.isNotEmpty(vo.getTradeAreaIds())){
            //前端用","来分隔商圈id
            String[] split = vo.getTradeAreaIds().split(",");
            for (String s :split){
                //惊醒拼接，平且截取商圈id
                criteria=criteria.and("tradeAreaIds").contains(","+s+",");
            }
        }
        //星级
        if (EmptyUtils.isNotEmpty(vo.getHotelLevel())){
            //is，条件只有一个，所以使用is
            criteria=criteria.and("hotelLevel").is(vo.getHotelLevel());
        }
        //特色
        if (EmptyUtils.isNotEmpty(vo.getFeatureIds())){
            String[] split = vo.getFeatureIds().split(",");
            for (String s :split){
                //惊醒拼接，平且截取商圈id
                criteria=criteria.and("featureIds").contains(","+s+",");
            }
        }
        //价格
        //最高价格
        if (EmptyUtils.isNotEmpty(vo.getMaxPrice())){
            criteria=criteria.and("minPrice").lessThan(vo.getMaxPrice());
        }
        //最低价格
        if (EmptyUtils.isNotEmpty(vo.getMinPrice())){
            criteria=criteria.and("minPrice").greaterThan(vo.getMinPrice());
        }
        //评分的升序
        //拼接，将上面获得的查询对放入query中，来进行升降的排序
        query.addCriteria(criteria);
        if (EmptyUtils.isNotEmpty(vo.getAscSort())){
            query.addSort(new Sort(Sort.Direction.ASC,vo.getAscSort()));
        }
        //评分的降序
        if (EmptyUtils.isNotEmpty(vo.getDescSort())){
            query.addSort(new Sort(Sort.Direction.DESC,vo.getDescSort()));
        }
        //设置当前页
        //设置当前页，默认从第一页开始
        int pageNo= Constants.DEFAULT_PAGE_NO;
        if (EmptyUtils.isNotEmpty(vo.getPageNo())){
            pageNo=vo.getPageNo();
        }
        //每页显示的数量
        //设置显示的数量
        int pageSize=Constants.DEFAULT_PAGE_SIZE;
        if (EmptyUtils.isNotEmpty(vo.getPageSize())){
            pageSize=vo.getPageSize();
        }
        //设置从那一页开始
        query.setOffset((pageNo-1)*pageSize);
        query.setRows(pageSize);
        //使用solr模板进行搜索
        ScoredPage<ItripHotelVO> forPage = solrTemplate.queryForPage(query, ItripHotelVO.class);
        //new Long(forPage.getTotalElements()).intValue();得到我们当前查多少数据
        Page page =new Page(pageNo,pageSize,new Long(forPage.getTotalElements()).intValue());
        //把记录数的数据查出来
        page.setRows(forPage.getContent());


        //返回数据
        return DtoUtil.returnDataSuccess(page);
    }



    /**
     * 根据热门城市查询酒店
     * @param vo
     * @return
     */
    @Override
    public Dto findHotelListByHotCity(SearchHotCityVO vo) {
        //判断城市id是否为空
        if (EmptyUtils.isEmpty(vo.getCityId())){
            return DtoUtil.returnFail("false","20004");
        }
        //如果id不为空，则进行搜索
        Query query=new SimpleQuery("*:*");
        //在solr中查询的字段名称
        Criteria criteria = new Criteria("cityId");
        //拼接字段，完成查询体条件
        criteria=criteria.contains(String.valueOf(vo.getCityId()));
        //赋值到query中
        query.addCriteria(criteria);
        //使用solr模板进行搜索
        ScoredPage<SearchHotCityVO> forPage = solrTemplate.queryForPage(query, SearchHotCityVO.class);
        //将搜索到的结果返回到前端
        return DtoUtil.returnDataSuccess(forPage);
    }
}
